home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_400 / 427_01 / software / multikbd.pas < prev   
Encoding:
Pascal/Delphi Source File  |  1994-03-23  |  1.3 KB  |  74 lines

  1. unit multikbd;
  2.  
  3.  
  4. interface
  5.  
  6.  
  7.   uses crt,
  8.        dos;
  9.  
  10.  
  11.   var key      : array [0 .. 127] of boolean;
  12.       last_key : byte;
  13.  
  14.  
  15.   procedure init_kbd;
  16.   (* initializes keyboard tables and keyboard interrupt procedure *)
  17.  
  18.   procedure reset_kbd;
  19.   (* resets normal keyboard interrupt *)
  20.  
  21.  
  22. implementation
  23.  
  24.  
  25. const kbd_inited : boolean = false;
  26.  
  27.  
  28. var old_9 : pointer;
  29.     value : byte;
  30.  
  31.  
  32. procedure reset_kbd;
  33. (* restores normal keyboard interrupt routine call *)
  34. begin
  35.   if kbd_inited then begin
  36.     kbd_inited := false;
  37.     setintvec (9, old_9);
  38.   end;
  39. end;
  40.  
  41.  
  42. (*$F+*)
  43. procedure game_kbd_int; interrupt;
  44. (* new interrupt handling routine *)
  45. (*$F-*)
  46. begin
  47.   last_key := port [$60];
  48.   if last_key = 1 then reset_kbd; (* ESC ends emulation *)
  49.   value      := port [$61];
  50.   port [$61] := value or 128;
  51.   port [$61] := value;
  52.   port [$20] := $20;
  53.   if (last_key and 128) = 0
  54.     then key [last_key        ] := true
  55.     else key [last_key and 127] := false;
  56. end;
  57.  
  58.  
  59. procedure init_kbd;
  60. (* initializes keyboard tables and keyboard interrupt procedure *)
  61. var i : integer;
  62. begin
  63.   if not kbd_inited then begin
  64.     kbd_inited := true;
  65.     getintvec (9, old_9);
  66.     setintvec (9, addr (game_kbd_int));
  67.     last_key := 0;
  68.     for i := 0 to 127 do key [i] := false;
  69.   end;
  70. end;
  71.  
  72.  
  73. begin
  74. end.